#!/bin/sh

ROOT_DIR=.
OUTPUT_DIR_Perf=perf
OUTPUT_DIR_Test=test

# 创建输出目录（如果不存在）
mkdir -p "$OUTPUT_DIR_Perf"
mkdir -p "$OUTPUT_DIR_Test"

# 计算总的测试项数量
total_tests=$(find "$ROOT_DIR" -name '*_test.go' -exec grep -oP 'func \K(Test\w*)' {} + | wc -l)
echo "总测试项数量为: $total_tests"

# 初始化已处理的测试项计数器
processed_tests_file=$(mktemp)
echo 0 > "$processed_tests_file"

# 查找所有 _test.go 文件
find "$ROOT_DIR" -name '*_test.go' | while read -r test_file; do
    echo "扫描到测试文件: $test_file"
    # 提取包名
    pkg=$(dirname "$test_file")
    echo $pkg

    pkg2=$(echo "$pkg" | sed 's|^\./||' | sed 's/\//_/g')

    # 查找所有测试函数
    grep -oP 'func \K(Test\w*)' "$test_file" | while read -r test_func; do
        path=$(echo "$pkg" | sed 's:.*/::')
        file="$test_func-$pkg2.txt"
        
        echo "执行函数测试: $test_func ( $pkg )"
        # 生成执行命令
        cmd="go test -v -run ^$test_func$ $pkg"

        # 检查测试结果文件是否已存在且行数大于等于5
        if [ -f "$OUTPUT_DIR_Test/$file" ] && [ $(wc -l < "$OUTPUT_DIR_Test/$file") -ge 5 ]; then
            echo "因为该测试已进行，函数 $test_func 测试结果已存放在 $OUTPUT_DIR_Test/$file 中"
        else
            if [ -f "$OUTPUT_DIR_Test/$file" ]; then
                echo "之前的测试结果有问题"
                echo "删除文件: $OUTPUT_DIR_Test/$file"
                rm "$OUTPUT_DIR_Test/$file"
                echo "删除文件: $OUTPUT_DIR_Perf/$file"
                rm "$OUTPUT_DIR_Perf/$file"
            fi
            $cmd > "$file" 2>&1
            echo $test_func >> "$file"
            echo "($pkg)" >> "$file"
            mv "$file" "$OUTPUT_DIR_Test"
        fi
        
        echo "开始perf测试"
        # 调用 perf 脚本
        ./performance_counter_920.sh "$cmd" "$OUTPUT_DIR_Perf"
        
        # 更新已处理的测试项计数器
        processed_tests=$(cat "$processed_tests_file")
        processed_tests=$((processed_tests + 1))
        echo $processed_tests > "$processed_tests_file"
        
        # 计算并显示进度
        progress=$(echo "scale=2; $processed_tests/$total_tests*100" | bc)
        echo "【进度: $processed_tests/$total_tests ($progress%)】"
    done
done

# 删除临时文件
rm "$processed_tests_file"


